/*Copyright (C) 2009 - 2011 MASSART GAUTHIER

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/

#include "../headers.h"

short rev_trouver_cases_jouables(short matrice[65], short joueur) {
	short i, j, k, allies = (joueur + '0'), ennemis = (joueur == 1) ? '2' : '1', cases_jouables = 0;
	bool ennemis_trouves = false;

	for(j = 0; j != 8; j++) {

		for(i = 1 + (8 * j); i != 9 + (8 * j); i++) { //Horizontale
			if(matrice[i] == allies) {
				for(k = i + 1; k != 9 + (8 * j); k++) {
					if(matrice[k] == ennemis) {
						ennemis_trouves = true;
					}
					else if(matrice[k] == ' ') {
						if(ennemis_trouves) {
							matrice[k] = '3';
							cases_jouables++;
						}
						break;
					}
					else {
						break;
					}
				}
				ennemis_trouves = false;
			}
		}
		for(i = 8 + (8 * j); i != 8 * j; i--) {
			if(matrice[i] == allies) {
				for(k = i - 1; k != 8 * j; k--) {
					if(matrice[k] == ennemis) {
						ennemis_trouves = true;
					}
					else if(matrice[k] == ' ') {
						if(ennemis_trouves) {
							matrice[k] = '3';
							cases_jouables++;
						}
						break;
					}
					else {
						break;
					}
				}
				ennemis_trouves = false;
			}
		}

		for(i = j + 1; i != 57 + j; i += 8) { //Verticale
			if(matrice[i] == allies) {
				for(k = i + 8; k != 65 + j; k += 8) {
					if(matrice[k] == ennemis) {
						ennemis_trouves = true;
					}
					else if(matrice[k] == ' ') {
						if(ennemis_trouves) {
							matrice[k] = '3';
							cases_jouables++;
						}
						break;
					}
					else {
						break;
					}
				}
				ennemis_trouves = false;
			}
		}
		for(i = 56 + j; i != j; i -= 8) {
			if(matrice[i] == allies) {
				for(k = i - 8; k != j - 8; k -= 8) {
					if(matrice[k] == ennemis) {
						ennemis_trouves = true;
					}
					else if(matrice[k] == ' ') {
						if(ennemis_trouves) {
							matrice[k] = '3';
							cases_jouables++;
						}
						break;
					}
					else {
						break;
					}
				}
				ennemis_trouves = false;
			}
		}

	}

	return cases_jouables;
}

short rev_choisir_case(short matrice[65], const char *nom_joueur, short joueur) {
	short i, l, choix = 0, save_choix;

	if(rev_trouver_cases_jouables(matrice, joueur)) {

		for(i = 1; i != 65; i++) {
			if(matrice[i] == '3') {
				choix = i;
				break;
			}
		}

		while(l != '\r' && l != '\n' && l != '\b') {

			rev_affichage(matrice, "Choisissez une case", nom_joueur, choix, joueur);

			l = getch();

			if(choix == 0 && l != KEY_RETURN) {
				choix = save_choix;
			}
			else if(l == touche_gauche) {
				for(i = choix - 1; i != 0; i--) {
					if(matrice[i] == '3') {
						choix = i;
						break;
					}
				}
			}
			else if(l == touche_droite) {
				for(i = choix + 1; i != 65; i++) {
					if(matrice[i] == '3') {
						choix = i;
						break;
					}
				}
			}
			else if(l == touche_bas) {
				for(i = choix + (8 - ((choix - 1) % 8)); i != 65; i++) {
					if(matrice[i] == '3') {
						choix = i;
						break;
					}
				}
			}
			else if(l == touche_haut) {
				for(i = choix - ((choix - 1) % 8); i != 0; i--) {
					if(matrice[i] == '3') {
						choix = i;
						break;
					}
				}
			}

			if(l == '0') {
				save_choix = choix;
				choix = 0;
			}
		}

		for(i = 0; i != 65; i++) {
			if(matrice[i] == '3') {
				matrice[i] = ' ';
			}
		}
	}
	else {
		choix = -1;
	}

	return choix;
}

void rev_retourner_jetons(short matrice[65], short choix, short joueur) {
	short i, j, allies = (joueur + '0'), ennemis = (joueur == 1) ? '2' : '1', matrice_sav[65];

	for(i = 0; i != 65; i++) {
		matrice_sav[i] = matrice[i];
	}

	for(i = choix + 1; i != choix + (8 - ((choix - 1) % 8)); i++) {
		if(matrice_sav[i] != ennemis) {
			if(matrice_sav[i] == allies) {
				for(j = choix; j != i; j++) {
					matrice[j] = allies;
					rev_affichage(matrice, "", "", -1, joueur);
					CSLP_Sleep(200);
				}
			}
			else {
				matrice[choix] = allies;
			}
			break;
		}
	}

	for(i = choix - 1; i != choix - (choix - 1) % 8 - 1; i--) {
		if(matrice_sav[i] != ennemis) {
			if(matrice_sav[i] == allies) {
				for(j = choix; j != i; j--) {
					matrice[j] = allies;
					rev_affichage(matrice, "", "", -1, joueur);
					CSLP_Sleep(200);
				}
			}
			else {
				matrice[choix] = allies;
			}
			break;
		}
	}

	for(i = choix - 8; i > 0; i -= 8) {
		if(matrice_sav[i] != ennemis) {
			if(matrice_sav[i] == allies) {
				for(j = choix; j != i; j -= 8) {
					matrice[j] = allies;
					rev_affichage(matrice, "", "", -1, joueur);
					CSLP_Sleep(200);
				}
			}
			else {
				matrice[choix] = allies;
			}
			break;
		}
	}

	for(i = choix + 8; i < 64; i += 8) {
		if(matrice_sav[i] != ennemis) {
			if(matrice_sav[i] == allies) {
				for(j = choix; j != i; j += 8) {
					matrice[j] = allies;
					rev_affichage(matrice, "", "", -1, joueur);
					CSLP_Sleep(200);
				}
			}
			else {
				matrice[choix] = allies;
			}
			break;
		}
	}

}

short rev_verif_gagner(short matrice[65], short tours) {
	short joueur_1 = 0, joueur_2 = 0, i = 0;

	if(tours == 64) {
		return 3;
	}

	for(i = 0; i != 65; i++) {
		if(matrice[i] == '1') {
			joueur_1++;
		}
		else if(matrice[i] == '2') {
			joueur_2++;
		}
	}

	if(joueur_1 == 0) {
		return 2;
	}
	else if(joueur_2 == 0) {
		return 1;
	}
	else {
		return 0;
	}
}

void rev_main() {
	short continuer = 0;
	char *contenu_titre = "REVERSI", prenom_2[100];

	clear();
	afficher_titre(contenu_titre);
	get_player_name(0, prenom);
	get_player_name(2, prenom_2);

	clear();
	afficher_titre(contenu_titre);

	while(continuer != 2) {
		short matrice[65] = {
			' ', // non utilisé
			' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
			' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
			' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
			' ', ' ', ' ', '1', '2', ' ', ' ', ' ',
			' ', ' ', ' ', '2', '1', ' ', ' ', ' ',
			' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
			' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
			' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
		};
		short quitter = 1, fin = 0, choix = 0, i, tours = 0;
		bool rejouer_J1 = true, rejouer_J2 = true;
		char message[100];
		memset(message, 0, sizeof(message));
		while(quitter != 0 && fin == 0) {
			rejouer_J1 = true, rejouer_J2 = true;
			while(rejouer_J1) {
				rejouer_J1 = false;
				while(CSLP_PollChar()) {
					getch();
				}
				choix = rev_choisir_case(matrice, prenom, 1);

				if(choix > 0) {
					rev_retourner_jetons(matrice, choix, 1);
				}
				else if(choix == -1) {
					rev_affichage(matrice, "Aucune action possible !", prenom, choix, 1);
					CSLP_Sleep(1500);
					tours--;
				}
				else if(choix == 0) {
					clear();
					choix = afficher_menu("Oui\nNon\n", "Voulez-vous quitter la partie en cours ?\n", contenu_titre);

					CSLP_ColorText(CT);

					if(choix == 1) {
						quitter = 0;
						rejouer_J1 = false;
						rejouer_J2 = false;
					}
					else {
						clear();
						afficher_titre(contenu_titre);
					}
				}
			}
			tours++;

			fin = rev_verif_gagner(matrice, tours);
			if(fin != 0) {
				rejouer_J2 = false;
			}

			while(rejouer_J2) {
				rejouer_J2 = false;
				while(CSLP_PollChar()) {
					getch();
				}
				choix = rev_choisir_case(matrice, prenom_2, 2);

				if(choix > 0) {
					rev_retourner_jetons(matrice, choix, 2);
				}
				else if(choix == -1) {
					rev_affichage(matrice, "Aucune action possible !", prenom_2, choix, 2);
					CSLP_Sleep(1500);
					tours--;
				}
				else if(choix == 0) {
					clear();
					choix = afficher_menu("Oui\nNon\n", "Voulez-vous quitter la partie en cours ?\n", contenu_titre);

					CSLP_ColorText(CT);

					if(choix == 1) {
						quitter = 0;
						rejouer_J2 = false;
					}
					else {
						clear();
						afficher_titre(contenu_titre);
					}
				}
			}
			tours++;
			fin = rev_verif_gagner(matrice, tours);
		}
		if(fin != 0) {
			clear();
			afficher_titre(contenu_titre);
			if(fin == 1) {
				rev_affichage(matrice, "a gagné !", prenom, -1, 1);
			}
			else if(fin == 2) {
				rev_affichage(matrice, "a gagné !", prenom_2, -1, 2);
			}
			else if(fin == 3) {
				rev_affichage(matrice, "a gagné !", "Quelqu'un", -1, 2);
			}
			getch();
		}
		clear();
		continuer = afficher_menu_recommencer(contenu_titre);
		clear();
	}
}
